package enums;

import Util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.util.TypeUtils;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 方法调用实体
 */
public class ReturnValue {
    /**
     * 响应码
     */
    private String code;
    /**
     * 是否成功
     */
    private boolean success;
    /**
     * 响应消息
     */
    private String message;
    /**
     * 响应数据
     */
    private Object data;
    /**
     * 异常
     */
    private Exception exception;
    /**
     * 键值数据
     */
    private Map<String, Object> mapData;

    /**
     * 提交状态：主要用于网络请求
     */
    private SubmitProcessStatus submitStatus;

    /**
     * 构造函数
     */
    public ReturnValue() {
        super();
        this.submitStatus = SubmitProcessStatus.NOTSUBMITTED;
    }

    /**
     * 构造函数
     *
     * @param success 是否成功
     * @param message 消息内容
     */
    public ReturnValue(boolean success, String message) {
        super();
        this.success = success;
        this.message = message;
        this.submitStatus = SubmitProcessStatus.NOTSUBMITTED;
    }

    /**
     * 构造函数
     *
     * @param success      是否成功
     * @param message      消息内容
     * @param submitStatus 提交状态
     */
    public ReturnValue(boolean success, String message, SubmitProcessStatus submitStatus) {
        super();
        this.success = success;
        this.message = message;
        this.submitStatus = submitStatus;
    }


    /**
     * 构造函数
     *
     * @param success    是否成功
     * @param message    消息内容
     * @param data       响应数据
     */
    public ReturnValue(boolean success, String message, Object data) {
        super();
        this.success = success;
        this.message = message;
        this.data = data;
        this.submitStatus = SubmitProcessStatus.NOTSUBMITTED;
    }

    /**
     * 设置响应码
     *
     * @param code 响应码
     */
    public ReturnValue setCode(String code) {
        this.code = code;
        return this;
    }

    /**
     * 获取响应码
     *
     * @return code
     */
    public String getCode() {
        return code;
    }

    /**
     * 设置返回消息
     *
     * @param message 消息内容
     */
    public ReturnValue setMessage(String message) {
        this.message = message;
        return this;
    }

    /**
     * 获取返回消息
     *
     * @return message
     */
    public String getMessage() {
        return message;
    }

    /**
     * 设置成功状态
     *
     * @param success 成功状态
     */
    public ReturnValue setSuccess(boolean success) {
        this.success = success;
        return this;
    }

    /**
     * 获取成功状态
     *
     * @return success
     */
    public boolean getSuccess() {
        return success;
    }

    /**
     * 设置返回数据
     *
     * @param data 返回数据
     */
    public ReturnValue setData(Object data) {
        this.data = data;
        return this;
    }

    /**
     * 获取返回数据
     *
     * @return data
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置异常
     *
     * @param exception 异常
     */
    public ReturnValue setException(Exception exception) {
        this.exception = exception;
        return this;
    }

    /**
     * 获取异常
     *
     * @return 异常
     */
    public Exception getException() {
        return exception;
    }


    /**
     * 设置键值对数据
     *
     * @param key   key
     * @param value value
     */
    public ReturnValue put(String key, Object value) {
        if (this.mapData == null) {
            this.mapData = new HashMap<>();
        }
        this.mapData.put(key, value);
        return this;
    }

    /**
     * 获取键值对数据
     *
     * @param key key
     * @return Object
     */
    public Object getObjectValue(String key) {
        if (this.mapData == null) {
            return null;
        }
        return this.mapData.get(key);
    }

    /**
     * 获取键值对数据
     *
     * @param key key
     * @return int
     */
    public int getIntValue(String key) {
        if (this.mapData == null) {
            return -1;
        }
        try {
            return TypeUtils.castToInt(this.mapData.get(key));
        } catch (Exception ex) {
            return -1;
        }
    }

    /**
     * 获取键值对数据
     *
     * @param key key
     * @return BigDecimal
     */
    public BigDecimal getBigDecimalValue(String key) {
        if (this.mapData == null) {
            return BigDecimal.ZERO;
        }
        try {
            return StringUtils.toBigDecimal(this.mapData.get(key));
        } catch (Exception ex) {
            return BigDecimal.ZERO;
        }
    }

    /**
     * 获取键值对数据
     *
     * @param key key
     * @return String
     */
    public String getStringValue(String key) {
        if (this.mapData == null) {
            return "";
        }
        try {
            return TypeUtils.castToString(this.mapData.get(key));
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * 获取键值对数据
     *
     * @param key
     * @param retClass
     * @param <T>
     * @return
     */
    public <T> T getValue(String key, Class<T> retClass) {
        return (T) getObjectValue(key);
    }

    /**
     * 设置提交状态
     *
     * @param submitStatus 提交状态
     */
    public void setSubmitStatus(SubmitProcessStatus submitStatus) {
        this.submitStatus = submitStatus;
    }

    /**
     * 获取提交状态
     *
     * @return SubmitProcessStatus
     */
    public SubmitProcessStatus getSubmitStatus() {
        return submitStatus;
    }

    /**
     * 重写 toString
     *
     * @return String
     */
    @Override
    public String toString() {
/*        StringBuffer sb = new StringBuffer();
        sb.append( JSON.toJSONString(this.data));
        return sb.toString();*/
        return JSON.toJSONString(data);
    }
}


